R中强大的apply、tapply、lapply、sapply、mapply家族
批量处理函数有很重要的apply族函数:lapply sapply apply tapply mapply。比起传统的for,while常常能获得更好的性能。
apply函数(对一个数组按行或者按列进行计算):
使用格式为:
apply(X, MARGIN, FUN, ...)
其中X为一个数组;MARGIN为一个向量(表示要将函数FUN应用到X的行还是列),若为1表示取行,为2表示取列,为c(1,2)表示行、列都计算。
示例代码:
函数lapply与函数sapply:
lapply的使用格式为:
lapply(X, FUN, ...)
lapply的返回值是和一个和X有相同的长度的list对象,这个list对象中的每个元素是将函数FUN应用到X的每一个元素。其中X为List对象(该list的每个元素都是一个向量),其他类型的对象会被R通过函数as.list()自动转换为list类型。
函数sapply是函数lapply的一个特殊情形,对一些参数的值进行了一些限定,其使用格式为:
sapply(X, FUN,..., simplify = TRUE, USE.NAMES = TRUE)
sapply(*, simplify = FALSE, USE.NAMES = FALSE) 和lapply(*)的返回值是相同的。如果参数simplify=TRUE,则函数sapply的返回值不是一个list,而是一个矩阵;若simplify=FALSE,则函数sapply的返回值仍然是一个list。
> y<-list(a=1:4,b=3:6,c=5:9) > y $a [1] 1 2 3 4 $b [1] 3 4 5 6 $c [1] 5 6 7 8 9 > lapply(y,function(x)x+1) $a [1] 2 3 4 5 $b [1] 4 5 6 7 $c [1] 6 7 8 9 10 > sapply(y,function(x)x+1) $a [1] 2 3 4 5 $b [1] 4 5 6 7 $c [1] 6 7 8 9 10函数mapply:
函数mapply是函数sapply的变形版,mapply 将函数 FUN 依次应用每一个参数的第一个元素、第二个元素、第三个元素上。函数mapply的使用格式如下:
mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)
其中参数MoreArgs表示函数FUN的参数列表。
> a<-matrix(1:12,c(3,4)) > a [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 > mapply(function(x,y,z)x+1+y+z,a[,1],a[,2],a[,3]) [1] 13 16 19tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
x是需要处理的向量,INDEX是因子(因子列表),FUN是需要执行的函数,simplify指是否简化输入结果(考虑sapply对于lapply的简化)
> n <- 17 > fac <- factor(rep(1:3, length = n), levels = 1:5) > fac [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 Levels: 1 2 3 4 5 > table(fac) fac 1 2 3 4 5 6 6 5 0 0 > tapply(1:n, fac, sum) 1 2 3 4 5 51 57 45 NA NA > tapply(1:n, fac, sum, simplify = FALSE) $`1` [1] 51 $`2` [1] 57 $`3` [1] 45 $`4` NULL $`5` NULL > tapply(1:n, fac, range) $`1` [1] 1 16 $`2` [1] 2 17 $`3` [1] 3 15 $`4` NULL $`5` NULL加入临床科研讨论群,请加13738062354或者pj1989zzj为好友,注明加群,就会拉你进群了。